类是一种复杂的数据类型,它是将不同类型的数据和对这些数据相关的操作封装在一起的集合体。因此在C++的类定义中不仅可以有数据,即数据成员,还可以有对数据进行操作的函数,即类的成员函数。类具有高度的抽象性,类中的数据具有隐藏性,类还具有封装性。类是一种用户自定义的类型,是一种类型的实现。把同类的事物根据不同的特征分成许多具体的个体,这些个体称为“对象”。
类的结构是用来确定一类对象的行为的,而这些行为是通过类的内部数据结构和相关的操作来确定的,这些行为通过一种操作接口来描述。
类的定义格式一般分为说明部分和实现部分。说明部分是用来说明该类中的成员,包含数据成员的说明和成员函数的说明。成员函数是用来对数据成员进行操作的,又称为“方法”。实现部分是用来对成员函数定义。概括地说,说明部分将告诉使用者“十什么”,而实现部分是告诉使用者“怎么干”。如:
class classname { private: <私有数据成员和成员函数的说明>; protected: <保护数据成员和成员函数的说明>; public: <公有数据成员和成员函数的说明>; //外部接口 };
有些类,如果实现部分较小,可以将说明部分和实现部分合并在一起,都放在类内定义。如果有些成员函数在类内进行了声明,而实现部分放在了类外,则需要类外定义的部分。
类名::函数名(参数列表)
::称为作用域运算符,也称作用域分辨符,它是用来表示某个成员函数是属于哪个类的。
protected限定友元函数和派生类可以访问;
对象成员的访问
对象名.数据成员;
对象名.成员函数名()
*对象指针名.数据成员名
对象指针名->数据成员名
类class是对结构体struct的增强,也是用于自定义类型。
struct Object { int a; int b; double c; }; class Object { public: int a; int b; double c; };
对成员函数的调用方法和成员变量差不多,也是用点号或用箭头。
Object obj;
obj.Test();
Object* p = &obj;
p->Test();
类的分离式写法
可以把成员函数的定义写在类体之外,遵循以下步骤:1 在类里保留成员函数的声明;2 在类外定义该成员函数,函数名字前面加上类名的范围前缀。如:
class Object // 写到头文件,如declar.h { public: int x; void Test(); }; void Object::Test() // 写到实现文件,如imple.cpp { ... } int main() //写到main.cpp,并在内包含declar.h { Object obj; obj.Test(); }
通常,它们分别写在头文件(.h)和源文件(.cpp)中;
构造函数是类的一种特殊的成员函数,1 函数名与类名相同;2 没有返回值;3 不能直接调用,在创建对象时系统自动调用;
class Circle { Circle() { x = y = 0; radius = 1; } public: int x, y; int radus; };
构造函数也可以重载,这意味着一个类可以有多个构造函数,只是它们的参数列表不同就可以;
析构是构造的反过程,表示的是对象的销毁过程。构造函数是在对象创建时被调用;析构函数则是在对象被销毁时被调用。对于有些对象来说,在它的生命周期中申请了一些资源,那么当它的生命斯结束时,必须记得释放和归还这些资源。1 名称固定:类名前加~; 2 没的返回值;3 不能带参数;
面向对象设计有3个主要特征:封装、继承和多态。继承使得一个类可以从现有类中派生,而不必重新定义一个新类。继承的实质就是用已有的数据类型创建新的数据类型,交保留已有数据类型的特点。在既有类基础上创建新类,新类包含了旧类的数据成员和成员函数,并且可以在新类中添加新的数据成员和成员函数。旧类被称为基类或父类,新类被称为派生类和子类。
class 派生类名称标识符:[继承方式] 基类名标识符 { [:访问控制修饰符:] [成员声明列表] }